热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用RabbitMQ实现高效延迟任务处理

本文详细探讨了如何利用RabbitMQ实现延迟任务,包括其应用场景、实现原理、系统设计以及具体的SpringBoot实现方式。

前言:本文旨在深入解析基于RabbitMQ的消息队列技术实现延迟任务的方法,涵盖从基础概念到实际应用的全过程,适用于对消息队列及延迟任务感兴趣的开发人员和技术爱好者。


一、延迟任务概述

延迟任务在现代互联网应用中十分常见,如订单超时自动取消、支付回调重试等。这些场景的特点是在未来某一时刻执行特定操作,并且通常只需执行一次。对于订单超时取消这类任务,由于其幂等性,不必担心重复消费的问题;而对于支付回调重试,则需要特别注意避免重复处理同一笔交易。


1、工作原理

在RabbitMQ中实现延迟任务,生产者将带有延迟属性的消息发送至指定的交换机。该交换机会根据设定的延迟时间将消息转发给相应的队列,消费者则通过监听队列来获取并处理这些消息。值得注意的是,为了保证系统的高可用性和稳定性,必须采取措施确保消息在交换机中的持久化存储,以防因服务中断导致未完成的任务丢失。


2、技术选型


二、系统设计方案


(一)环境配置

为支持延迟消息功能,需在RabbitMQ服务器上安装插件。此插件允许开发者指定消息的延迟时间,从而实现精准的定时任务调度。


(二)生产者实现

生产者的职责是确保消息能够准确无误地发送到RabbitMQ。为此,我们采用confirm确认机制,即消息发送后等待RabbitMQ的确认回复,以验证消息是否成功到达。例如,在创建订单的过程中,首先将订单信息保存到数据库和Redis缓存中,随后发送带有延迟属性的消息至RabbitMQ。一旦接收到确认响应,便从Redis中移除相关记录;若未能成功发送,则重新尝试直至成功。


(三)消费者实现

消费者负责接收并处理来自队列的消息,关键在于确保消息不会丢失且能正确处理。这包括手动确认每条消息的接收状态,保持消费者的长期在线,以及为可能出现的错误提供重试机制。特别是对于那些幂等性的操作,如订单取消,无需额外处理重复消费的情况。


三、Spring Boot实践示例

以下是使用Spring Boot框架实现延迟任务的部分核心代码,完整项目可在GitHub上找到。


(一)生产者代码片段

在处理订单时,首先确保订单数据的安全存储,然后利用RabbitMQ发送带有延迟属性的消息。

for (long i = 1; i <= 10; i++) {
// 模拟生成订单
BuOrder order = createOrder(i);
// 订单入库
orderService.saveOrUpdate(order);
// 将订单存入Redis
RedisUtils.setObject(RabbitTemplateConfig.ORDER_PREFIX + i, order);
// 向RabbitMQ异步投递消息
rabbitTemplate.convertAndSend(RabbitmqConfig.DELAY_EXCHANGE_NAME, RabbitmqConfig.DELAY_KEY, order, RabbitUtils.setDelay(30000), RabbitUtils.correlationData(order.getOrderId()));
}

生产者通过确认机制确保消息的可靠传递:

public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (correlatiOnData== null) return;
String key = RabbitTemplateConfig.ORDER_PREFIX + correlationData.getId();
if (ack) {
// 消息成功投递,删除Redis中订单数据
RedisUtils.deleteObject(key);
} else {
// 从Redis中读取订单数据,重新投递
BuOrder order = RedisUtils.getObject(key, BuOrder.class);
rabbitTemplate.convertAndSend(RabbitmqConfig.DELAY_EXCHANGE_NAME, RabbitmqConfig.DELAY_KEY, order, RabbitUtils.setDelay(30000), RabbitUtils.correlationData(order.getOrderId()));
}
}


(二)消费者代码片段

消费者端通过手动确认消息的消费,确保消息处理的可靠性,并具备自动重试功能。

@RabbitListener(queues = RabbitmqConfig.DELAY_QUEUE_NAME)
public void consumeNode01(Channel channel, Message message, BuOrder order) throws IOException {
if (order.getOrderStatus() == 0) {
// 更新订单状态为已关闭
orderService.updateById(new BuOrder(order.getOrderId(), -1));
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
log.info(String.format("消费者节点01消费编号为【%s】的消息", order.getOrderId()));
}
}

建议部署多个消费者实例,以提高消息处理效率,减少队列积压。


(三)辅助工具类

文中提及的RabbitUtils工具类包含了一些与RabbitMQ交互的基础方法,该类位于以下Maven依赖中:


xin.altitude.cms
ucode-cms-common
1.4.3.1


推荐阅读
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • RabbitMQ 核心组件解析
    本文详细介绍了RabbitMQ的核心概念,包括其基本原理、应用场景及关键组件,如消息、生产者、消费者、信道、交换机、路由键和虚拟主机等。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 华为USG基于源地址的多出口策略路由配置
    网络拓扑如下:组网情况:企业用户主要有技术部(VLAN10)和行政部(VLAN20),通过汇聚交换机连接到USG。企业分别通过两个不同运营商(ISP1和ISP2)连接到 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • MySQL性能测试标准倡议:老叶提出的压测基准
    进行MySQL的压力测试通常是为了评估新旧版本之间的性能差异、验证硬件升级的效果、测试参数调整的影响以及评估新业务的负载承受能力。老叶提出了一个MySQL压力测试基准值倡议,旨在促进行业内的标准化和成果共享。 ... [详细]
  • 本文详细探讨了虚拟化的基本概念,包括服务器虚拟化、网络虚拟化及其在云计算环境中的应用。特别强调了SDN技术在网络虚拟化和云计算中的关键作用,以及网络虚拟化技术如何提升资源利用效率和管理灵活性。 ... [详细]
  • 本文深入探讨了PHP中的Socket通信机制,不仅详细解释了Socket的工作原理,还提供了具体的代码示例,帮助开发者更好地理解和应用Socket技术。 ... [详细]
author-avatar
歌手王紫璇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有